import tkinter as tk
from tkinter import messagebox
import utils
from PIL import Image, ImageTk
import cv2


class App:
    def __init__(self):
        # 创建主窗口
        self.main_window = tk.Tk()
        self.main_window.title("人脸考勤系统")
        # 设置窗口大小和位置 宽1200px 高500px 位于屏幕（200，100）坐标
        self.main_window.geometry("1100x500+200+100")
        # 禁止调整窗口的大小
        self.main_window.resizable(width=False, height=False)
        # 右侧按钮  区域 标题
        # 创建右侧主框架
        self.right_frame = tk.Frame(
            self.main_window,
            width=400,
            height=500,
            bg="#e4e4e4"
        )
        self.right_frame.place(x=750, y=50)
        # 2、添加标题标签
        self.title_label = tk.Label(
            self.right_frame,
            text="  身份验证登录",
            font=("Arial", 25, "bold"),
            bg="#f0f0f0",
            pady=90

        )
        self.title_label.pack()  # 垂直布局排列

        # 添加登录按钮
        self.login_btn = utils.get_button(
            self.main_window,
            "登录",
            "green",
            self.login
        )
        # 按钮的位置
        self.login_btn.place(x=750, y=230)
        # 注册按钮
        self.register_user = utils.get_button(
            self.main_window,
            "注册新用户",
            'gray',
            self.register,
            fg='black'
        )
        self.register_user.place(x=750, y=330)

        self.webcam_label = utils.get_img_label(self.main_window)
        # 标签的位置 x=10 y=0 宽高700 500
        self.webcam_label.place(x=10, y=0, width=700, height=500)
        # 调用摄像头
        self.add_webcam(self.webcam_label)

    def add_webcam(self, label):
        # 初始化摄像头 绑定到目标标签中
        # label 用于显示摄像头里面的tkinter标签
        # 检查类实例是否已存在cap属性
        if "cap" not in self.__dict__:
            self.cap = cv2.VideoCapture(0)

        # 保存目标标签的引用
        self.__label = label
        # 启动摄像头
        self.process_webcam()

    def process_webcam(self):
        # 处理摄像头帧并实时显示在标签上

        # 读取视频帧
        ref, frame = self.cap.read()
        # 保存每一帧
        self.most_recent_frame = frame
        # 转换颜色空间
        img = cv2.cvtColor(self.most_recent_frame, cv2.COLOR_BGR2RGB)
        # 将 numpy数组转为PIL图像
        self.most_recent_frame = Image.fromarray(img)
        # PIL图像转为Tkinter
        imgtk = ImageTk.PhotoImage(image=self.most_recent_frame)
        # print(imgtk)
        # 保存PIL
        self.__label.imgtk = imgtk
        # 更新标签的显示图像
        self.__label.configure(image=imgtk)

        # 定时20 毫秒后在次调用自身
        self.__label.after(20, self.process_webcam)

    def login(self):
        # messagebox.showinfo("提示：", "登录功能正在开发。。")
        pass

    def register(self):
        # messagebox.showinfo("提示：", "注册功能正在开发。。")
        '''
        注册功能，图布和首页的图布保持一致
        :return:
        '''
        self.register_window = tk.Toplevel(self.main_window)
        self.register_window.geometry("1100x500+200+100")

        self.accept_btn = utils.get_button(
            self.register_window,
            "提交",
            'green',
            self.accept_register
        )
        self.accept_btn.place(x=750, y=230)
        self.rest_btn = utils.get_button(
            self.register_window,
            "重置",
            'red',
            self.rest_register
        )
        self.rest_btn.place(x=750, y=330)

        # 捕获摄像头
        self.captrue_label=utils.get_img_label(self.register_window)
        self.captrue_label.place(x=10,y=0,width=700,height=500)

    # 提交
    def accept_register(self):
        pass

    # 重置
    def rest_register(self):
        pass

    def startup(self):
        # 启动应用程序
        self.main_window.mainloop()


if __name__ == "__main__":
    app = App()
    app.startup()
